package com.bjsxt.controller;

import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bjsxt.domain.UserBank;
import com.bjsxt.dto.UserBankDto;
import com.bjsxt.dto.UserBankFeignDto;
import com.bjsxt.feign.UserBankFeignClient;
import com.bjsxt.model.Result;
import com.bjsxt.service.UserBankService;
import com.bjsxt.util.SpringSecurityUtils;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;

import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * description:
 * 会员银行卡控制层
 * 会员银行卡的权限:
 * 查询： user_bank_query
 * 修改： user_bank_update
 * TODO: 这里的修改权限在数据库中是没有的需要后期进行添加, 暂时进行注释的操作
 *
 * @author ALIENWARE <br />
 * @date 2021/8/24
 */
@RestController
@RequestMapping("/userBanks")
@Api(tags = "会员银行卡控制器")
public class UserBankController implements UserBankFeignClient {

    /**
     * 会员银行卡业务层接口
     */
    @Autowired
    private UserBankService userBankService;

    /**
     * 用户的银行卡数据分页查询
     *
     * @param page   分页对象<UserBank>
     * @param userId 用户 id
     * @return 统一响应对象
     */
    @GetMapping
    @PreAuthorize("hasAuthority('user_bank_query')")
    @ApiOperation(value = "用户的银行卡数据分页查询", authorizations = {@Authorization("Authorization")})
    @ApiImplicitParams({
            @ApiImplicitParam(name = "current", value = "当前页", dataType = "Long", paramType = "query", example = "1"),
            @ApiImplicitParam(name = "size", value = "每页条数", dataType = "Long", paramType = "query", example = "20"),
            @ApiImplicitParam(name = "userId", value = "用户 Id", dataType = "Long", paramType = "query", example = "1")
    })
    public Result<Page<UserBank>> findByPage(@ApiIgnore Page<UserBank> page, Long userId) {
        // 查询时间, 我们讲最近新增的, 修改的数据优先展示, 排序 last_update_time
        page.addOrder(OrderItem.desc(UserBank.COL_LAST_UPDATE_TIME));
        // 调用业务层进行分页数据的查询
        Page<UserBank> userBankPage = userBankService.pageByUserId(page, userId);
        // 返回响应数据
        return Result.success(userBankPage);
    }

    /**
     * 查询当前用户正在使用的银行卡数据
     *
     * @return 统一响应对象
     */
    @GetMapping("/current")
    // @PreAuthorize("hasAuthority('user_bank_update')")
    @ApiOperation(value = "查询当前用户正在使用的一张银行卡", authorizations = {@Authorization("Authorization")})
    public Result<UserBank> getCurrentUserBank() {
        // 获取当前用户 ID
        Long userId = SpringSecurityUtils.getCurrentUserId();
        // 根据用户 id 用户持有的银行卡
        List<UserBank> userBanks = userBankService.listByUserId(userId);
        // 如果返回的集合是空那么返回空回去
        if (userBanks.isEmpty())
            return Result.success();
        // 返回响应数据
        return Result.success(userBanks.get(0));
    }

    /**
     * 获取用户银行卡数据
     *
     * @param userId 用户 id
     * @return 用户银行卡
     */
    @Override
    public UserBankFeignDto getUserBank(Long userId) {
        // 调用业务层方法并返回
        return userBankService.getByUserId(userId);
    }

    @PostMapping("/bind")
    //@PreAuthorize("hasAuthority('user_bank_update')")
    @ApiOperation(value = "用户绑定银行卡", authorizations = {@Authorization("Authorization")})
    @ApiImplicitParams({
            @ApiImplicitParam(name = "userBankDto", value = "绑定银行卡的 json 数据", dataType = "String", paramType = "body", example = "{}")
    })
    public Result<Void> bindBank(@Validated @RequestBody UserBankDto userBankDto) {
        // 获取当前用户 id
        Long userId = SpringSecurityUtils.getCurrentUserId();
        // 调用业务层方法进行数据的绑定
        boolean flag = userBankService.bindBank(userId, userBankDto);
        // 如果为 true 绑定成功
        if (flag) return Result.success("绑定成功");
        // 如果为 false 绑定失败
        return Result.fail("绑定失败");
    }

    /**
     * 启用/禁用一张银行卡
     *
     * @param id     要启用/禁用一张银行卡 Id
     * @param status 要设置的银行卡状态值 1: 启用 0: 禁用
     * @return 统一响应对象
     */
    @PostMapping("/status")
    // @PreAuthorize("hasAuthority('user_bank_update')")
    @ApiOperation(value = "启用/禁用一张银行卡", authorizations = {@Authorization("Authorization")})
    @ApiImplicitParams({
            @ApiImplicitParam(name = "id", value = "要启用/禁用一张银行卡 Id", dataType = "Long", required = true, paramType = "query", example = "1"),
            @ApiImplicitParam(name = "status", value = "要设置的银行卡状态值 1: 启用 0: 禁用", dataType = "Byte", paramType = "query", example = "1")
    })
    public Result<Void> updateStatus(@NotNull Long id, Byte status) {
        // 创建更新的 userBank 对象
        UserBank userBank = new UserBank();
        // 设置 id 及需要更新的值
        userBank.setId(id);
        userBank.setStatus(status);
        // 调用业务层方法进行数据的保存
        boolean flag = userBankService.updateById(userBank);
        // 如果为 true 更新成功
        if (flag) return Result.success("更新成功");
        // 如果为 false 更新失败
        return Result.fail("更新失败");
    }

    /**
     * 更新银行卡数据
     *
     * @param userBank 银行卡数据对象
     * @return 统一响应对象
     */
    @PatchMapping
    //@PreAuthorize("hasAuthority('user_bank_update')")
    @ApiOperation(value = "更新银行卡数据", authorizations = {@Authorization("Authorization")})
    @ApiImplicitParams({
            @ApiImplicitParam(name = "userBank", value = "UserBank 的 json 数据", dataType = "String", paramType = "body", example = "{}")
    })
    public Result<Void> update(@RequestBody @Validated UserBank userBank) {
        // 调用业务层方法进行数据的保存
        boolean flag = userBankService.updateById(userBank);
        // 如果为 true 更新成功
        if (flag) return Result.success("更新成功");
        // 如果为 false 更新失败
        return Result.fail("更新失败");
    }
}
